<?php
namespace app\common\model;

class Sms extends BaseModel{

	/**
	 * 发送短信验证码
	 * @param  [type] $mobile 用户ID
	 * @param  [type] $type
	 */
	public function send_smscode($mobile, $type = ''){
		if(preg_match('/^1[34578][0-9]{9}$/', $mobile)==false){
			$this->tips_info = '对不起，手机号不正确！';
			return false;
		}

		// 判断是否可以发送
		$mobile_exists = model('User')->mobile_exists($mobile);
		// 忘记密码判断
		if($type == 'forget_password' && $mobile_exists == false){
			$this->tips_info = '手机号不存在！';
			return false;
		}
		// 注册时判断是否注册过
		if($type == 'register' && $mobile_exists == true){
			$this->tips_info = '您的手机已经注册过，若忘记密码，请使用“找回密码”功能。';
			return false;
		}
		// 更换手机号
		if($type == 'update_mobile' && $mobile_exists == true){
			$this->tips_info = '手机号已存在，不能更换！';
			return false;
		}
		// 更换手机号
		if($type == 'change_mobile' && $mobile_exists == true){
			$this->tips_info = '手机号已存在，不能更换！';
			return false;
		}
		// 绑定手机号
		if($type == 'bind_mobile' && $mobile_exists == true){
			$this->tips_info = '手机号已存在，不能绑定！';
			return false;
		}
		
		// 短信发送时间限制
		$sms_time   = cache('API_SMSCODE_TIME' . $mobile);
		$sms_time   = $sms_time ? $sms_time : 0;
		$limit_time = 60;
		if((time() - $sms_time) <= $limit_time){
			$this->tips_info = '对不起，1分钟内不能重复获取短信验证码，请过后再试！';
			return false;
		}

		// 判断发送次数，按天
		$sms_num  = cache('API_SMSCODE_NUM_' . $mobile);
		$sms_num  = $sms_num ? $sms_num : 0;
		if($sms_num >= 10){
			$this->tips_info = '您发送短信次数过多！';
			return false;
		}

		// 判断发送次数，30分钟内只能发送3条短信
		$sms_30time  = cache('API_SMSCODE_30TIME' . $mobile);
		$sms_30time  = $sms_30time ? $sms_30time : 0;
		if((time() - $sms_30time) < 30 * 60 && $sms_num >= 3){
			$this->tips_info = '对不起，30分钟内只能发送3条短信，请过后再试！';
			return false;
		}

		// 缓存验证码
		$smscode = cache('API_SMSCODE_' . $mobile);
		// 生成验证码
		$smscode = $smscode ? $smscode : \TPString::randString(6, 1);
		$smscode = str_replace('4', '8', $smscode);// 替换验证码4为8
		// 短信内容
		$smscode_tpl = model('Config')->_get('smscode_tpl', 'sms');
		$smscode_tpl = str_replace(
			array('#code#', '#signature#'),
			array($smscode, model('Config')->_get('signature','sms')),
			$smscode_tpl
		);
		$content = $smscode_tpl ? $smscode_tpl : '您的短信验证码为' . $smscode;

		// 发送短信
		import('Sms', EXTEND_PATH, '.class.php');
		$sms  = new \Sms();
		// 设置验证码
		$sms->smscode = $smscode;
		$info = $sms->send($mobile, $content);
		if($info['status'] == 200){
			//缓存验证码10分钟
			cache('API_SMSCODE_' . $mobile, $smscode, 300);
			//保存发送次数，保存半天
			cache('API_SMSCODE_NUM_' . $mobile, $sms_num + 1, 12 * 60 * 60);
			//保存当前短信发送时间
			cache('API_SMSCODE_TIME' . $mobile, time());
			//保存当前短信发送时间，每30分钟一次
			if(!$sms_30time){
				cache('API_SMSCODE_30TIME' . $mobile, time(), 30 * 60);
			}
			return true;
		}else{
			$this->tips_info = '短信发送失败->' . $info['info'];
			return false;
		}
	}
	/**
	 * 检查验证码是否正确
	 * @param  string $mobile  手机号
	 * @param  string $smscode 验证码
	 */
	public function check_smscode($mobile = '', $smscode = ''){
		if(!$mobile || !$smscode){
			return false;
		}
		//验证码判断
		$cache_smscode = cache('API_SMSCODE_' . $mobile);
		if($cache_smscode != $smscode){
			return true;
		}

		return false;
	}

	public function send_voice_code($mobile, $type = ''){
		if(preg_match('/^1[34578][0-9]{9}$/', $mobile) == false){
			$this->tips_info = '对不起，手机号不正确！';
			return false;
		}
		//判断是否可以发送
		$mobile_exists = model('User')->mobile_exists($mobile);
		//忘记密码判断
		if($type == 'forget_password' && $mobile_exists == false){
			$this->tips_info = '手机号不存在！';
			return false;
		}
		//注册时判断是否注册过
		if($type == 'register' && $mobile_exists == true){
			$this->tips_info = '您的手机已经注册过，若忘记密码，请在登录页面使用“找回密码”功能。';
			return false;
		}
		//更换手机号
		if($type == 'update_mobile' && $mobile_exists == true){
			$this->tips_info = '手机号已存在，不能更换！';
			return false;
		}
		//短信发送时间限制
		$sms_time   = cache('API_VOICECODE_TIME' . $mobile);
		$sms_time   = $sms_time ? $sms_time : 0;
		$limit_time = 60;
		if((time() - $sms_time) <= $limit_time){
			$this->tips_info = '对不起，1分钟内不能重复获取短信验证码，请过后再试！';
			return false;
		}

		//判断发送次数，按天
		$sms_num  = cache('API_VOICECODE_NUM_' . $mobile);
		$sms_num  = $sms_num ? $sms_num : 0;
		if($sms_num >= 10){
			$this->tips_info = '您发送短信次数过多！';
			return false;
		}

		//判断发送次数，30分钟内只能发送3条短信
		$sms_30time  = cache('API_VOICECODE_30TIME' . $mobile);
		$sms_30time  = $sms_30time ? $sms_30time : 0;
		if((time() - $sms_30time) < 30 * 60 && $sms_num >= 3){
			$this->tips_info = '对不起，30分钟内只能发送3条短信，请过后再试！';
			return false;
		}
		//缓存验证码
		$smscode = cache('API_SMSCODE_' . $mobile);
		//生成验证码
		$smscode = $smscode ? $smscode : \Org\Util\String::randString(6, 1);
		$smscode = str_replace('4', '8', $smscode);// 替换验证码4为8
		//发送语音
		import('Sms', EXTEND_PATH, '.class.php');
		$sms  = new \Sms();
		$info = $sms->yunpian_voice_send($mobile, $smscode);
		if($info['status'] == 200){
			//缓存验证码30分钟
			cache('API_SMSCODE_' . $mobile, $smscode, 1800);
			//保存发送次数，保存半天
			cache('API_VOICECODE_NUM_' . $mobile, $sms_num + 1, 12 * 60 * 60);
			//保存当前短信发送时间
			cache('API_VOICECODE_TIME' . $mobile, time());
			//保存当前短信发送时间，每30分钟一次
			if(!$sms_30time){
				cache('API_VOICECODE_30TIME' . $mobile, time(), 30 * 60);
			}
			return true;
		}
		return false;
	}
	/**
	 * 发送短信
	 * @param  [type] $mobiles  手机号
	 * @param  [type] $content  短信内容
	 */
	public function send($mobiles, $content){
		if(!$mobiles || !$content){
			return false;
		}
		// 添加短信签名
		$content = model('Config')->_get('signature', 'sms') . $content;
		//发送短信
		import('Sms', EXTEND_PATH, '.class.php');
		$sms = new \Sms();
		$sms->send_type = $this->send_type ? $this->send_type : 'yunpian';
		$info = $sms->send($mobiles, $content);
		if($info['status'] == 200){
			return true;
		}else{
			return false;
		}
	}
}